const {promisify} = require('util')
const fs = require('fs')

// 记得加 , 'utf8'
let read = promisify(fs.readFile)

// all 方法 最终返回的是一个promise
// 如果全成功了， 才算成功 如果一个失败，全部失败

function isPromise(x) {
  if((typeof x == 'object' && x != null) || typeof x == 'function') {
    if(typeof x.then == 'function') {
      return true
    }
  }
  return false
}

Promise.all = function(promises) {
  return new Promise((resolve, reject) => {
    let arr = []
    let idx = 0
    let processDate = (value, index) => {
      arr[index] = value
      if(++idx === promises.length) {
        resolve(arr)
      }
    }
    for(let i=0; i<promises.length; i++){
      let currentValue = promises[i]
      if(isPromise(currentValue)) {
        currentValue.then((y) => {
          processDate(y, i)
        }, reject)
      }else{
        processDate(currentValue, i)
      }
    } 
  })
}

Promise.all([1, read(`${process.cwd()}/1.Promise/2.promise/age.txt`, 'utf8'), 2, read(`${process.cwd()}/1.Promise/2.promise/name.txt`, 'utf8'), 3, 4, 5]).then(data => {
  console.log(data)
  //不加 'utf8' [ 1, <Buffer 32 35>, 2, <Buffer 61 67 65 2e 74 78 74>, 3, 4, 5 ]
  //加'utf8' [ 1, '25', 2, 'age.txt', 3, 4, 5 ]
}, err => {
  console.log(err)
})

// Promise.all 特点就是 让所有的promise并发执行 根据执行各书判断是否执行完成
 
// 自己实现一下 Promise.race() 实现promise.race 赛跑